// utils/auth.js - 用户认证相关工具函数

/**
 * 检查用户是否已登录
 * @returns {boolean} 是否已登录
 */
function isLoggedIn() {
  const token = wx.getStorageSync('token')
  const userInfo = wx.getStorageSync('userInfo')
  return !!(token && userInfo)
}

/**
 * 获取用户Token
 * @returns {string} 用户Token
 */
function getToken() {
  return wx.getStorageSync('token') || ''
}

/**
 * 获取用户信息
 * @returns {object|null} 用户信息
 */
function getUserInfo() {
  return wx.getStorageSync('userInfo') || null
}

/**
 * 保存用户登录信息
 * @param {string} token - JWT Token
 * @param {object} userInfo - 用户信息
 */
function saveLoginInfo(token, userInfo) {
  wx.setStorageSync('token', token)
  wx.setStorageSync('userInfo', userInfo)
  
  // 更新全局数据
  const app = getApp()
  app.globalData.isLogin = true
  app.globalData.token = token
  app.globalData.userInfo = userInfo
}

/**
 * 清除用户登录信息
 */
function clearLoginInfo() {
  wx.removeStorageSync('token')
  wx.removeStorageSync('userInfo')
  
  // 更新全局数据
  const app = getApp()
  app.globalData.isLogin = false
  app.globalData.token = ''
  app.globalData.userInfo = null
}

/**
 * 检查Token是否过期
 * @param {string} token - JWT Token
 * @returns {boolean} 是否过期
 */
function isTokenExpired(token) {
  if (!token) return true
  
  try {
    // 解析JWT Token
    const payload = JSON.parse(atob(token.split('.')[1]))
    const currentTime = Math.floor(Date.now() / 1000)
    
    // 检查是否过期
    return payload.exp < currentTime
  } catch (error) {
    console.error('Token解析失败:', error)
    return true
  }
}

/**
 * 刷新Token
 * @returns {Promise} 刷新结果
 */
function refreshToken() {
  const app = getApp()
  const currentToken = getToken()
  
  if (!currentToken) {
    return Promise.reject('没有有效的Token')
  }
  
  return new Promise((resolve, reject) => {
    wx.request({
      url: `${app.globalData.baseUrl}/auth/refreshToken`,
      method: 'POST',
      header: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${currentToken}`
      },
      success: (res) => {
        if (res.statusCode === 200 && res.data.code === 1) {
          const newToken = res.data.data.token
          const userInfo = getUserInfo()
          
          // 保存新Token
          saveLoginInfo(newToken, userInfo)
          resolve(newToken)
        } else {
          reject(res.data.msg || 'Token刷新失败')
        }
      },
      fail: (error) => {
        reject('网络请求失败')
      }
    })
  })
}

/**
 * 退出登录
 */
function logout() {
  const app = getApp()
  const token = getToken()
  
  // 调用后端退出登录接口
  if (token) {
    wx.request({
      url: `${app.globalData.baseUrl}/auth/logout`,
      method: 'POST',
      header: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${token}`
      },
      success: (res) => {
        console.log('退出登录API响应:', res)
      },
      fail: (error) => {
        console.error('退出登录API失败:', error)
      }
    })
  }
  
  // 清除本地登录信息
  clearLoginInfo()
  
  // 跳转到登录页面
  wx.reLaunch({
    url: '/pages/login/login'
  })
  
  wx.showToast({
    title: '已退出登录',
    icon: 'success'
  })
}

/**
 * 检查并处理Token过期
 * @returns {Promise<boolean>} 是否有效
 */
function checkTokenValid() {
  const token = getToken()
  
  if (!token) {
    return Promise.resolve(false)
  }
  
  if (isTokenExpired(token)) {
    console.log('Token已过期，尝试刷新')
    
    return refreshToken()
      .then(() => {
        console.log('Token刷新成功')
        return true
      })
      .catch((error) => {
        console.error('Token刷新失败:', error)
        logout()
        return false
      })
  }
  
  return Promise.resolve(true)
}

module.exports = {
  isLoggedIn,
  getToken,
  getUserInfo,
  saveLoginInfo,
  clearLoginInfo,
  isTokenExpired,
  refreshToken,
  logout,
  checkTokenValid
}
